SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[paChequearAltasDeServicios]
-- <DESCRIPCION> Realiza el Chequeo de movimiento de alta de a 1 o varias plazas.
-- <CONSIDERACIONES ESPECIALES>  Alta de Incrementos de Horas y Situaciones Extraordinarias y Actualizacion de dueño actual y ultimo docente
-- <TABLAS> tb_ServiciosAgentes, tb_SubServiciosAgentes, tb_ColaDeMovimientos, tb_PlazasDeMovimiento, tb_RelInterServivcios (incremento de horas), tb_Movimientos, tb_Plazas
-- <ACTUALIZACIONES> 20 - 03 -2006 por OTERO, Javier.  |  21 - 03 - 2006 por OTERO, Javier (Incremento de Horas)
-- <ACTUALIZACIONES> 22 - 03 -2006 por SANES, Jorge. (Mensaje Acumulacion de Horas)  | 24 - 03 - 2006 por OTERO, Javier. (Se agregan controles de Fecha de Plazas y Fechas del Movimiento)
-- <ACTUALIZACIONES> 27 - 03 -2006 por SANES, Jorge. (Control sobre comparacion Horas Suplente con Horas Titular)  
-- <ACTUALIZACIONES> 28 - 03 -2006 por SANES, Jorge. (Control de Altas por Transferencias no controla inconpatibilidad horaria, corregir control de Servicio Relacionado )  
-- <ACTUALIZACIONES> 29 - 03 -2006 por SANES, Jorge. (Controles de Tipo de Alta Acrecentamiento (Tipo 16) de Horas)
-- <ACTUALIZACIONES> 29 - 03 -2006 por SANES, Jorge. (Controles de Tipo de Alta Parejas Pedagogicas (Tipo 17) de Horas)
-- <ACTUALIZACIONES> 29 - 03 -2006 por OTERO, Javier. (Control de limites de dias respecto a la fecha del dia para pasar un Movimiento)
-- <ACTUALIZACIONES> 30 - 03 -2006 por SANES, Jorge. (Cambio en Topes y Calculo de Incompatibilidad Horaria)
-- <ACTUALIZACIONES> 31 - 03 -2006 por SANES, Jorge. (Cambio en Calculo de Incompatibilidad Horaria tomar tipos de servicio 1 y 2 )
-- <ACTUALIZACIONES> 31 - 03 -2006 por SANES, Jorge. (Se agrego Parametro TopeHorasTotalesDeServicios en Tb_Parametros)
-- <ACTUALIZACIONES> 03 - 04 -2006 por FIGUERO, Roberto - SANES, Jorge. (Cambio en Calculo de Incompatibilidad Horaria, Consultas de Calculo de Horas y mas...... )
-- <ACTUALIZACIONES> 05 - 04 -2006 por FIORUCCI, Adriana y SANES, Jorge. (Cambio en Cada Select que Acumula Horas para tener en cuenta la Fecha de Baja si se trata de Altas que Incian y Terminan )
-- <ACTUALIZACIONES> 06 - 04 -2006 por  SANES, Jorge  (Esto quedo asi  SET @Fecha2 = @Fecha2 - 1   ---- Se le resta un dia porque asi sera generada la Fecha de Baja del Servicio para el Control de Incompatibilidad)
-- <ACTUALIZACIONES> 06 - 04 -2006 por  SANES, Jorge  (Se cambio OR por AND en IF para ver si no debe cargar las Horas por 131)
-- <ACTUALIZACIONES> 07 - 04 -2006 por  SANES, Jorge  (Se cambio el control sobre las horas 131 porque no dan los tiempos en los movimientos informados por las Escuelas, se retorna Codigo 2 con posibilidad forzar)
-- <ACTUALIZACIONES> 10 - 04 -2006 por FIORUCCI, Adriana y SANES, Jorge. (Cambio en Cada Select que Acumula Horas se quito el Max contra los subservicios, se utiliza las fechas del Subservicio y se mira para la incompatibilidad en el dia del alta del servicio)
-- <ACTUALIZACIONES> 26 - 04 -2006 por FIORUCCI, Adriana  (Agregué en Hrs Terciarias el filtro para que no cuente los subservicios con licencia y cuenta incompatibilidad)
-- <ACTUALIZACIONES> 19 - 05 -2006 por SANES, Jorge. (Controles de Tipo de Alta Concentracion de Tareas)
-- <ACTUALIZACIONES> 08 - 04 -2007 por SANES, Jorge. (Cambio en Control de InCompatibilidad Horaria se toma de la Causa de Alta se agrego campo en la Tabla)
-- <ACTUALIZACIONES> 27 - 11 -2007 por FIORUCCI, Adriana  (Cambio en Control de InCompatibilidad Horaria se cambio control de Fechas)
-- <ACTUALIZACIONES> 26 - 12 -2007 por SANES, Jorge  (Cambio en Control de InCompatibilidad Horaria se cambio control de Fechas, cuando la Fecha de Alta y Baja del Servicio es igual no se tiene en cuenta OJO)
-- <ACTUALIZACIONES> 08 - 04 -2008 por OTERO, Marcelo y SANES, Jorge  (Cambio en Control de InCompatibilidad Horaria se agrego control contra la Tb_RelIterservicio y las Plazas PT) (Referencia -- Agregado 08-04-2008)
-- <ACTUALIZACIONES> 02 - 07-2008  por OTERO, Marcelo y SANES, Jorge  (Cambio de Control de InCompatibilidad Horaria, se cambio totalmente la forma)
-- <ACTUALIZACIONES> 05 - 09-2008  por FIORUCCI, Adriana y SANES, Jorge  (Cambio en Control de Agente duplicado en una plaza, se cambio select para tener en cuenta la fecha de baja)
-- <ACTUALIZACIONES> 18 - 06-2009  por OTERO, Marcelo  y SANES, Jorge  (Se le envia la Fecha Prevista de Termino al control de Incompatibilidad horaria)
-- <ACTUALIZACIONES> 06 - 03-2010  por OTERO, Marcelo  y SANES, Jorge  (Ajustes en chequeos de Altas por Transferencia)
-- <ACTUALIZACIONES> 16 - 03-2010  por OTERO, Marcelo  y SANES, Jorge  (Chequeo de Alta Por Transferencia, control de la Fecha de Baja del Servicio a Relacionar )
-- <ACTUALIZACIONES> 25 - 03-2010  por OTERO, Marcelo  y SANES, Jorge  (Chequeo de Alta Por Transferencia, ahora pidieron que dejemos bajar automaticamente aquellos servicios con licencia 127/139/143/144)
-- <ACTUALIZACIONES> 06 - 04-2010  por OTERO, Marcelo  y SANES, Jorge  (Chequear que el Servicio a relacionar que ya esta de baja, sea baja por Transferencia)
---------------------------------------------------
-- Publicado en DB SAGENet
--	29-07-2008   -  OTERO, Marcelo y SANES, Jorge
--	05-09-2008   - FIORUCCI, Adriana y SANES, Jorge
--
@IdCola INT,
@Estado INT OUTPUT,
@Diagnostico VARCHAR(1000) OUTPUT
AS
SET NOCOUNT ON
SET DATEFORMAT DMY
-- Fecha de Alta en la cola de movimientos
DECLARE @Fecha1 DATETIME
-- Fecha de Baja en la cola de movimientos
DECLARE @Fecha2 DATETIME

--Fecha Probable de Termino
DECLARE @FechaTermino DATETIME

-- Fecha para Control de Incompatibilidad Horaria
DECLARE @FechaFinControl DATETIME 


-- Almacena la plaza donde trabajara el agente.
DECLARE @idPlaza INT

DECLARE @SubServicio INT
-- ID del Agente que afecta el movimiento.
DECLARE @Agente INT
-- Para almacenar la acumulacion horaria del agente en horas.
DECLARE @AcumHorariaH INT
--Para almacenar la acumulacion horaria del agente en cargos no terciarias (por equivalencia horaria del cargo)
DECLARE @AcumHorariaC INT
--Para almacenar la acumulacion horaria del agente en cargos terciarios (por equivalencia horaria del cargo)
DECLARE @AcumHorariaCTer INT -- Creada el 3/4/2006
-- Para almacenar la acumulacion horaria total
DECLARE @AcumHoraria INT
-- Almacena el Total de Horas nuevas (de los movimientos que se pasan)
DECLARE @SumHorasNuevas INT
-- Horas dadas de alta para el Agente con Articulo 131
DECLARE @Horas131 INT
-- Total de horas terciarias que tiene el agente.
DECLARE @HorasTerciarias INT
DECLARE @MinHorasTerciarias INT
DECLARE @ServicioARelacionar INT
DECLARE @CausaAlta INT
-- Almacena las horas de movimientos sin procesar
DECLARE @HorasPendientes INT

-- Variable para retorno de diagnostico.
SET @Diagnostico = ' '
-- Guarda la fecha de alta de la plaza
DECLARE @FAltaPlaza DATETIME
-- Guarda la Fecha de Baja de la Plaza
DECLARE @FBajaPlaza DATETIME
-- Se utiliza para guardar el CUPOF de la plaza
DECLARE @CUPOF VARCHAR(40)
DECLARE @Baja VARCHAR(1)
DECLARE @error INT
DECLARE @cod INT
DECLARE @regimensuplencias INT
DECLARE @situacionrevista VARCHAR(2)
-- Almacena le valor del parametro TopeDeHorasDeServicios
DECLARE @TopeHorasDeServicios INT
DECLARE @TopeHorasTotales INT 
DECLARE @TipoDePaquete INT
-- Almacena el codigo de Paquete de Plaza
DECLARE @Paquete INT
-- Almacena el Nombre de un Agente Agente (para mensajes de retorno)
DECLARE  @nagente VARCHAR(25)
-- Almacena Situacion de Revista de un Agente (para mensajes de retorno)
DECLARE @sitrevagente VARCHAR(2)
DECLARE @AgenteAnterior INT
DECLARE @SitRevAgenteNuevo INT
DECLARE @HoraDePlaza VARCHAR(1)
DECLARE @CantidadDeHoras INT
DECLARE @CargoSalarial INT
DECLARE @Escalafon INT
DECLARE @HorasServiciosExternos INT
DECLARE @HorasServiciosExternosTer INT -- Creada el 3/4/2006
DECLARE @HorasTotales INT
-- Para almacenar el modo del usuario.
DECLARE @Modo INT
DECLARE @ExisteMovimientoPendiente BIT
DECLARE @ExisteMovimientoAprobado BIT
DECLARE @EsIncremento BIT
-- Almacena el parametro para contar la cantidad de dias permitidos para pasar un movimiento posterior.
DECLARE @DiasPosterioresAlta INT
-- Almacena el parametro para contar la cantidad de dias permitidos para pasar un movimiento anterior a la fecha.
DECLARE @DiasAnterioresAlta INT
-- Almacena el parametro para contar la cantidad de dias permitidos para pasar un movimiento con fecha de baja posterior a la fecha.
DECLARE @DiasPosterioresBaja INT
-- Almacena el parametro para contar la cantidad de dias permitidos para pasar un movimiento con fecha de baja anterior a la fecha.
DECLARE @DiasAnterioresBaja INT
-- Para Control de InCompatibilidad Horaria (08/04/2007)
DECLARE @CausaAltaChequeaIncompatibilidad VARCHAR(1) 


-- Declarar Variables para Nuevo Control de Incompatibilidad
DECLARE @IncompatibleChk INT 
DECLARE @EstadoChk INT 
DECLARE  @DiagnosticoChk VARCHAR(200)

-- Variables para Control de Fecha de Baja
DECLARE @FechaBajaSerRel DATETIME 
DECLARE @FechaBajaDesdeSerRel DATETIME 
DECLARE @FechaBajaHastaSerRel DATETIME 
DECLARE @MotivoBajaSR INT 



-- INICIALIZAR VARIABLES
SET @IncompatibleChk = 0 
SET @EstadoChk = 0 
SET @DiagnosticoChk = ''

-- INICIALIZAR VARIABLES

SET @AcumHoraria=0
SET @SumHorasNuevas=0
SET @HorasPendientes=0
SET @HorasTotales=0
SET @Horas131=0
SET @HorasServiciosExternos=0
SET @HorasServiciosExternosTer=0 -- Creada el 3/4/2006

SET @CantidadDeHoras=0
SET @AcumHorariaH=0
SET @AcumHorariaC=0
SET @AcumHorariaCTer=0  -- Creada el 3/4/2006
SET @HorasTerciarias=0

SET @Estado = 0  ---adriana
SET @cod = 0
SET @error = 0
SET @ExisteMovimientoPendiente = 0
SET @ExisteMovimientoAprobado = 0
SET @EsIncremento = 0

SET @CausaAltaChequeaIncompatibilidad = 'N'

SELECT @Modo = Modo FROM tb_Usuarios WHERE NTUser = SYSTEM_USER

-- Saca el Tope de Horas a controlar.
SELECT @TopeHorasDeServicios = CONVERT(INT, valor1) FROM tb_Parametros WHERE Parametro like 'TopeHorasDeServicios'
SELECT @DiasPosterioresAlta = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeAltaPosterior'
SELECT @DiasAnterioresAlta = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeAltaAnteriores'
SELECT @DiasPosterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaPosterior'
SELECT @DiasAnterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaAnteriores'
SELECT @TopeHorasTotales =  CONVERT(INT, valor1) FROM tb_Parametros WHERE Parametro like 'TopeHorasTotalesDeServicios'

-- La proxima query se modifico el 3/4/2006
SELECT @Fecha1 = Fecha1, @Fecha2 = Fecha2, @FechaTermino = FechaTermino, @Agente = Agente, @SitRevAgenteNuevo = sitrev, @CausaAlta = CausaAlta, @CantidadDeHoras = CantidadHoras,
	@CargoSalarial = CargoSalarial, @situacionrevista=tb_SituacionRevista.mnemo,@Escalafon=tb_cargossalariales.escalafon 
FROM tb_ColaDeMovimientos inner join tb_SituacionRevista on tb_SituacionRevista.idSituacionRevista=tb_ColaDeMovimientos.sitrev 
INNER JOIN Tb_cargossalariales on tb_ColaDeMovimientos.cargosalarial=tb_cargossalariales.idcargo
  WHERE idCola = @idCola

  

IF @Fecha2 IS NOT NULL
     SET @Fecha2 = @Fecha2 - 1   ---- Se le resta un dia porque asi sera generada la Fecha de Baja del Servicio

-- Se controla que el movimiento no sea demasiado alejado a la fecha del dia.
IF @Fecha1 < GETDATE() AND (DATEDIFF(DAY, @Fecha1, GETDATE())+1) > @DiasAnterioresAlta
	SELECT @Cod = 1, @Diagnostico = 'Error! El movimiento que se desea pasar es demasiado antiguo (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresAlta)+' dias).'
ELSE
	IF  (DATEDIFF(DAY, GETDATE(), @Fecha1)+1) > @DiasPosterioresAlta
		SELECT @Cod = 1, @Diagnostico = 'Error! El movimiento que se desea pasar tiene mas de '+CONVERT(VARCHAR, @DiasPosterioresAlta)+' dias posteriores a la fecha'

IF @Fecha2 IS NOT NULL AND @Fecha2 < GETDATE() AND (DATEDIFF(DAY, @Fecha2, GETDATE())+1) > @DiasAnterioresBaja
	SELECT @Cod = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos anteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresAlta)+' dias de diferencia).'
ELSE
	IF @Fecha2 IS NOT NULL AND @Fecha2 > GETDATE() AND (DATEDIFF(DAY, GETDATE(), @Fecha2)+1) > @DiasPosterioresBaja
		SELECT @Cod = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos posteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresAlta)+' dias de diferencia).'

-- Se controla que la fecha de alta sea menor que la fecha de baja
IF @Fecha2 IS NOT NULL
	IF @Fecha2 < @Fecha1
		SELECT @Cod = 3, @Diagnostico = 'Error! La Fecha de Baja del movimiento es anterior a la Fecha de Alta'


IF @Fecha1 IS NULL OR @Fecha1 = ''
	SELECT @Cod = 3, @Diagnostico = 'Debe Ingresar Fecha de Alta.'


IF @FechaTermino IS NOT NULL AND @FechaTermino < @Fecha1
	SELECT @Cod = 3, @Diagnostico = 'La Fecha Prevista de Termino Indicada debe ser Mayor o Igual a la Fecha de Alta'
/*
--Si el Servicio es Suplente y la Baja es en distinto mes que la alta, se debe informar por separado
IF month(@Fecha1) <> Month (@Fecha2) and @SitRevAgenteNuevo = 4
	SELECT @Cod = 3, @Diagnostico = 'En un servicio Suplente, si el mes de Baja es distinto al mes de Alta, la Baja debe informarse por separado.'

*/
IF @Cod = 3
   GOTO Salir


DECLARE xPlazas CURSOR forward_only for SELECT idPlaza, Servicio, HorasDePlaza, IDServicioRelacionado FROM tb_PlazasDeMovimiento WHERE idCola = @idCola
OPEN xPlazas
FETCH NEXT FROM xPlazas INTO @idPlaza, @SubServicio, @HoraDePlaza, @ServicioARelacionar

WHILE @@FETCH_STATUS = 0 
BEGIN
	/* ----------------------------------------------
	Acumulamos las horas nuevas.
	Si la plaza corresponde a un paquete que es del tipo HS X CARGO, CARGOS COMPARTIDOS no se cuentan las horas. 
	Si la plaza es cabecera de un paquete del tipo HS X CARGO, CARGOS COMPARTIDOS se cuenta.
	*/
	SELECT @TipoDePaquete = TipoDePaquete, @Paquete = Paquete, @RegimenSuplencias = regimensuplencias, @FAltaPlaza = FechaAlta, @FBajaPlaza = FechaBaja, @CUPOF = CUPOF, @Baja = Baja
	FROM tb_Plazas WHERE idPlaza = @idPlaza

	IF EXISTS(SELECT top 1 IdCola FROM tb_PlazasDeMovimiento WHERE IdCola = @IdCola AND IdPlaza = @IdPlaza AND RelInterServicio = 5)
		SELECT @EsIncremento = 1

	IF EXISTS(SELECT top 1 C.IdCola FROM tb_ColaDeMovimientos C INNER JOIN tb_PlazasDeMovimiento P ON P.IdCola = C.IdCola
		WHERE C.IdCola <> @IdCola -- Que no se la misma cola.
		AND C.Agente = @Agente -- El mismo agente.
		AND Fecha1 = @Fecha1 -- La misma fecha de Alta.
		AND IdPlaza = @IdPlaza -- La misma plaza
		AND C.Estado IN (0,1, 3) -- El estado es Chequeado o Warning o Error
	) AND @Modo = 2
	BEGIN
		SELECT @ExisteMovimientoPendiente = 1, @Cod = 99, @Diagnostico = @Diagnostico+'*' + 'Error! El movimiento en la Plaza: '+@CUPOF+' con Codigo de Movimiento: '+CONVERT(VARCHAR, @IdCola)+' se encuentra pendiente. Por favor elimine el movimiento anterior.'
	END

	IF EXISTS(SELECT top 1 C.IdCola FROM tb_ColaDeMovimientos C INNER JOIN tb_PlazasDeMovimiento P ON P.IdCola = C.IdCola
		WHERE C.IdCola <> @IdCola -- Que no se la misma cola.
		AND C.Agente = @Agente -- El mismo agente.
		AND Fecha1 = @Fecha1 -- La misma fecha de Alta.
		AND IdPlaza = @IdPlaza -- La misma plaza
		AND C.Estado IN (4, 5) -- El estado es Aprobado o Aprobado con Observaciones.
	) AND @Modo = 2
	BEGIN
		SELECT @ExisteMovimientoAprobado = 1, @Cod = 99, @Diagnostico = '*' + @Diagnostico+'Error! El movimiento en la Plaza: '+@CUPOF+' con Codigo de Movimiento: '+CONVERT(VARCHAR, @IdCola)+' ya fue aprobado por Personal Docente.'
	END

	-- Se controla que la Fecha de Alta de la Plaza sea anterior a la fecha de alta del movimiento.
	IF EXISTS(SELECT top 1 IdPlaza FROM tb_Plazas WHERE IdPlaza = @IdPlaza AND FechaAlta > @Fecha1)
	BEGIN
		SELECT @Cod = 3, @Diagnostico = @Diagnostico + '*' + 'Error! La Plaza '+@CUPOF+' tiene Fecha de Alta posterior a la fecha del movimiento'
	END

	-- CONTAR LAS HORAS NUEVAS
	IF (@TipoDePaquete IN (1,3)) OR (@TipoDePaquete IS NULL AND @Paquete IS NULL) 
	BEGIN
		--Es alta por 131
		IF @CausaAlta = 12    --Art131 
			BEGIN 			
				SELECT @Horas131 = @Horas131 + ISNULL(CASE WHEN @HoraDePlaza = 'S' THEN P.Horas ELSE @CantidadDeHoras END, 0)
					FROM tb_Plazas P WHERE IdPlaza = @IdPlaza	
			END 
		  ELSE
			BEGIN
				--Si es Horas Terciarias o es un Cargo Terciario
				IF @CargoSalarial = 4001 or @escalafon=24
				     BEGIN
					SELECT @HorasTerciarias = @HorasTerciarias + ISNULL(CASE WHEN @HoraDePlaza = 'S' THEN P.Horas ELSE @CantidadDeHoras END, 0)
					FROM tb_Plazas P WHERE IdPlaza = @IdPlaza	
				     END
				ELSE
				     BEGIN -- No son horas 131 ni terciarias ni cargos terciarios
					SELECT @SumHorasNuevas = @SumHorasNuevas + 
						ISNULL(CASE 		
						WHEN C.RegimenSalarial  = 12 AND @HoraDePlaza = 'S' THEN P.Horas
						WHEN C.RegimenSalarial  = 12 AND @HoraDePlaza = 'N' THEN @CantidadDeHoras
						WHEN C.RegimenSalarial  = 13 AND @HoraDePlaza = 'S' THEN P.Horas
						WHEN C.RegimenSalarial  = 13 AND @HoraDePlaza = 'N' THEN @CantidadDeHoras
						END,0)
						FROM tb_Plazas P  INNER JOIN tb_CargosSalariales C ON IdCargo = CargoSalarialDefault WHERE IdPlaza = @IdPlaza
				     END 
			END 
	END 	

	--- Control agregado 29-03-2006
	--- Si la Causa de Alta es distinta de "Pareja Pedagogica" (17) no controla estado del Servicio ni tampoco misma situacion de revista
	IF @CausaAlta <> 17
 	    BEGIN 
		-- // Exists anterior cambiado 05/09/2008
		/*
		IF EXISTS (SELECT top 1 * FROM tb_ServiciosAgentes S INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
				WHERE Plaza = @IdPlaza AND SS.FechaAlta <= @Fecha1 AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @Fecha1)) AND SituacionLaboral = 5
		AND ( (@EsIncremento = 0) OR (@EsIncremento = 1 AND Agente <> @Agente))
		)
		*/
		-- CONTROLA QUE NO HAYA UN SERVICIO NORMAL EN LA PLAZA.
		IF EXISTS (SELECT TOP 1 * FROM tb_ServiciosAgentes S 
					INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
					WHERE Plaza = @IdPlaza 
	  				AND ( 
	  					( SS.FechaAlta <= @Fecha1 AND ((SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @Fecha1)))
			   		 	OR  ( @fecha2 IS NULL AND SS.FechaBaja IS NULL) 
			   		 	OR  ( @fecha2 IS NOT NULL AND SS.FechaAlta <= @fecha2 AND ((SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >=@fecha2)))
					        )
					AND SituacionLaboral = 5
					AND ( (@EsIncremento = 0) OR (@EsIncremento = 1 AND Agente <> @agente))
			     )

		BEGIN
			SELECT @nAgente = (SELECT Nombres FROM tb_Agentes, tb_Plazas WHERE DuenoActual = idAgente and idPlaza = @idPlaza)
			SELECT  @cod = 1, @Diagnostico = @Diagnostico+'*'+'Error! El agente no puede darse de alta porque plaza '+@CUPOF+' se encuentra ocupada por otro Agente! ( Dueño: '+isnull(@nAgente, ' ')
			SELECT @nAgente = (SELECT Nombres FROM tb_Agentes, tb_Plazas WHERE UltimoDocente = idAgente and idPlaza = @idPlaza)
			IF @nAgente is not null
				SELECT @Diagnostico = @Diagnostico + ' - Agente actual: '+@nAgente+')'
			ELSE
				SELECT @Diagnostico = @Diagnostico + ')'
		END
	
		
		-- NO DEJAR DOS TITULARES O INTERINOS EN LA MISMA PLAZA
		IF EXISTS (SELECT top 1 IdServicioAgente FROM tb_ServiciosAgentes S INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
				WHERE Plaza = @IdPlaza AND SituacionRevista IN (1,2) and  
					  SS.FechaAlta <= @Fecha1 AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @Fecha1))
			AND ( (@EsIncremento = 0) OR (@EsIncremento = 1 AND Agente <> @Agente))
			AND @SituacionRevista IN ('T', 'I') )
		BEGIN
			SELECT @nAgente = ISNULL(MAX(Nombres), ' ') FROM tb_ServiciosAgentes S
			INNER JOIN tb_SubServiciosAgentes SS ON ServicioAgente = IdServicioAgente
			INNER JOIN tb_Agentes A ON IdAgente = Agente
			WHERE Plaza = @IdPlaza AND SituacionRevista IN (1,2) and  
					  SS.FechaAlta <= @Fecha1 AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @Fecha1))
			SELECT @Cod = 3, @Diagnostico = '*' + 'Error! No se puede realizar el alta porque la plaza '+@CUPOF+' esta ocupada por otro Titular o Interino (Dueño: '+@nAgente+')'
	
		END
		
	     END 


	IF @situacionrevista IN ('S', 'F') AND @regimensuplencias = 13
		SELECT @Cod = 3, @Diagnostico = @Diagnostico+'*'+'La plaza '+@Cupof+' no admite Suplentes Comunes o Funcionales' 	
	
	IF @CausaAlta = 8 
		IF  (@ServicioARelacionar IS NULL OR @ServicioARelacionar < 0) --Si es designacion por TRANSFERENCIA y no se especifico un Servicio a RELACIONAR
				BEGIN
					SELECT @cod = 3, @Diagnostico = @Diagnostico + '*'+'Cuando se especifica ALTA POR TRANSFERENCIA debe seleccionar el Servicio a Relacionar'	
					GOTO Salir	
				END 
		                  ELSE
				BEGIN
				    	-- Ver que el servicio a Bajar sea de la misma persona
					IF  @Agente <> (SELECT Agente FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioARelacionar)
					  BEGIN
						SELECT @cod = 3, @Diagnostico = @Diagnostico + '*'+'El Servicio relacionado debe pertenecer al mismo Agente.-'		
						GOTO Salir
					  END 
		
		
					-- Controlar Horas a dar de Alta con Horas a dar de Baja  --- ESTO ES SOLO UN AVISO QUE DEJA FORZAR EL MOVIMIENTO
		
					DECLARE @HorasAlta INT 
					DECLARE @HorasBaja INT 
		
					IF @HoraDePlaza = 'S'
						 SELECT @HorasAlta = Horas FROM tb_Plazas WHERE idPlaza = @idPlaza
					ELSE 
						SET @HorasAlta = @CantidadDeHoras
		
					 SELECT @HorasBaja = Horas FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioARelacionar
		
					--- ACA FALTARIA VER EL ACUMULADO DE HORAS DE ALTA CONTRA UN MISMO SERVICIO BAJADO
		
					IF @HorasAlta > @HorasBaja
					  BEGIN
						SELECT @Cod = 1, @Diagnostico = @Diagnostico + '*'+'ATENCIÓN : Las Horas a dar de Alta superan las del Servicio a dar de Baja.-'		
					  END 
				
					/*	
					-- Controlar Regimen Salarial en ambos servicios
					IF  (SELECT Regimensalarial FROM tb_CargosSalariales WHERE idCargo = @CargoSalarial) <> (SELECT RegimenSalarial FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioARelacionar)
					  BEGIN
						SELECT @cod = 3, @Diagnostico = @Diagnostico + '*'+'El Regimen Salarial debe ser el mismo para el Nuevo Servicio y el Relacionado'		
						GOTO Salir
					  END 
					*/
		
				    	-- Ver si el servico a bajar ya no esta de baja
					IF  EXISTS(SELECT IdServicioAgente FROM Tb_ServiciosAgentes WHERE  idServicioAgente = @ServicioARelacionar AND FechaBaja IS NULL)
					     
					     BEGIN
						-- Si no esta de baja, debemos controlar el estado del servicio a bajar
						IF NOT EXISTS ( SELECT S.idServicioAgente  FROM tb_SubserviciosAgentes SS 
									INNER JOIN tb_ServiciosAgentes S ON S.idServicioAgente = SS.ServicioAgente 
									WHERE S.idServicioAgente = @ServicioARelacionar AND SS.FechaBaja IS NULL 
									  AND @Fecha1 >= SS.FechaAlta
									 AND ((SS.SituacionLaboral = 5 AND SS.SituacionExtraordinaria = 1) OR (SS.Licencia IN (16, 21, 22, 46)))
								)
									 
							BEGIN

								SELECT @cod = 3, @Diagnostico = @Diagnostico + '*'+'La Sit. Laboral y/o Extraordinaria de Servicio Relacionado elegido no es Normal y/o la Fecha de Alta del ultimo Subservicio es mayor a la Fecha de Alta ingresada. Debe Procesar la Baja manualmente y/o Finalizar la Licencia.- '		
								GOTO Salir
							END 
		
					     END 
					ELSE
					     BEGIN


						SELECT @FechaBajaSerRel = FechaBaja, @MotivoBajaSR = CausaBaja FROM Tb_ServiciosAgentes WHERE  idServicioAgente = @ServicioARelacionar 

						-- Agregado 06/04/2010
						IF @MotivoBajaSR <> 7
							BEGIN
								SELECT @cod = 3, @Diagnostico = @Diagnostico + '*'+' La Causa de Baja del Servicio seleccionado a Relacionar no es por Transferencia.'		
								GOTO Salir
							END 		

						-- Agregado 16/03/2010
						SET @FechaBajaDesdeSerRel = DATEADD(DAY, -1, @FechaBajaSerRel)
						SET @FechaBajaHastaSerRel = DATEADD(DAY, 1, @FechaBajaSerRel)
						
						
						IF @Fecha1 > @FechaBajaHastaSerRel or  @Fecha1 < @FechaBajaDesdeSerRel
							BEGIN
								SELECT @cod = 3, @Diagnostico = @Diagnostico + '*'+'El Servicio Seleccionado tiene una Fecha de Baja distinta a la Fecha del Alta que intenta registrar. Verifique el CUPOF seleccionado.- '		
								GOTO Salir
							END 		


								
					     END 	
					
		
				END

	UPDATE tb_PlazasDeMovimiento SET Estado = @cod WHERE idPlaza = @idPlaza AND idCola = @idCola
	UPDATE tb_ColaDeMovimientos SET EstadoCheck = @cod WHERE idcola = @idcola

						
	FETCH NEXT FROM xPlazas INTO @idPlaza, @SubServicio, @HoraDePlaza, @ServicioARelacionar
 END

CLOSE xPlazas
DEALLOCATE xPlazas


--- Control agregado 28-03-2006
--- Si la Causa de Alta es distinta de "Designacion por Transferencia" (8) no controla la Inconpatibilidad de Cargos
--- Control agregado 29-03-2006
--- Si la Causa de Alta es distinta de "Acrecentamiento Horario" (16) no controla la Incompatibilidad de Cargos
--- Control agregado 03-04-2006
--- Si la Causa de Alta es distinta de "125c" (18) no controla la Incompatibilidad de Cargos
--- Control agregado 19-05-2006
--- Si la Causa de Alta es distinta de "Concentracion de Tareas" (19) no controla la Incompatibilidad de Cargos

-- Buscar por la Causa de Alta para ver si Chequea InCompatibilidad (08/04/2007)
SELECT @CausaAltaChequeaIncompatibilidad = ChequeaInCompatibilidad FROM Tb_CausasAltas WHERE IdCausaAlta =  @CausaAlta

IF @CausaAltaChequeaIncompatibilidad = 'S'
   BEGIN 
	

	-- Agregado 18-06-2009
	IF @Fecha2 IS NULL
		IF @FechaTermino IS NULL 
			SET @FechaFinControl = NULL
		ELSE 
			SET @FechaFinControl = @FechaTermino
	ELSE
		SET @FechaFinControl = @Fecha2

	EXEC paChequearIncompatibilidadHorariaV3  'A', @CausaAlta, @Agente, @SumHorasNuevas, 0, @HorasTerciarias, @Horas131, @Fecha1, @FechaFinControl, NULL, @IncompatibleChk OUTPUT, @EstadoChk OUTPUT, @DiagnosticoChk OUTPUT

	IF @IncompatibleChk <> 0
		BEGIN 
			---- Un aviso o Imcompatible Total
			SET @Cod = @EstadoChk
			SET  @Diagnostico = @Diagnostico+'*'+@DiagnosticoChk
		END

     END 


IF @ExisteMovimientoPendiente = 1 
	SELECT @Cod = 99

IF @ExisteMovimientoAprobado = 1
	SELECT @Cod = 99


SALIR:

UPDATE tb_ColaDeMovimientos SET Estado = @cod, EstadoCheck = @cod,
ChequeoEscuela = CASE WHEN @Modo = 2 THEN @Diagnostico ELSE ChequeoEscuela END
WHERE idcola = @idcola


SET @Estado = @Cod
GO
GRANT EXECUTE ON  [dbo].[paChequearAltasDeServicios] TO [GestionInstitucional]
GRANT EXECUTE ON  [dbo].[paChequearAltasDeServicios] TO [PersonalDocente]
GRANT EXECUTE ON  [dbo].[paChequearAltasDeServicios] TO [PersonalDocenteDireccion]
GO
